package edu.pe.cayetano.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.commons.beanutils.DynaBean;

import ws.synopsis.frmwrk.common.BResult;
import edu.pe.cayetano.framework.Configuration;
import edu.pe.cayetano.framework.DAOException;
import edu.pe.cayetano.model.to.PlanTratamientoDetalleTO;
import edu.pe.cayetano.model.to.PlanTratamientoTO;
import edu.pe.cayetano.model.to.ServicioTO;
import edu.pe.cayetano.seccd.constantes.ConstantesSECCD;
import edu.pe.cayetano.util.UtilCollections;
import edu.pe.cayetano.util.UtilTime;
import edu.pe.cayetano.util.Utilitario;

public class PlanTratamientoDAO  extends BaseDAO{

	public PlanTratamientoDAO(Connection cnx) {
		super(cnx);
	}
	
	/**
	 * Metodo que retorna el listado de ciclos
	 * */
	public BResult buscarPlanTratamientoxArchivo(DynaBean dyna) throws Exception{

		PlanTratamientoTO			plantTO	 			= null;
		PreparedStatement   		pstmt 		 		= null;
		ResultSet 					rs 			 		= null;
		BResult						ret					= new BResult();
		try{
				StringBuffer query  = new StringBuffer();
				query.append(" SELECT FILEHC"); 
				query.append(" FROM "+schema+"PLAN_TRATAMIENTO");
				query.append(" WHERE FILEHC=?");
				System.out.println("PlanTratamientoDAO::buscarPlanTratamientoxArchivo:<"+query.toString()+">");
				pstmt = getConnection().prepareStatement(query.toString());
				pstmt.setString(1,Utilitario.getPropertyDynaBean(dyna,"txtFileHC"));
				rs=pstmt.executeQuery();
				if(rs.next()){
					// si existe el archivo
					plantTO=new PlanTratamientoTO();
					plantTO.setFileHC(rs.getString(1));
					ret.setCode(ConstantesSECCD.EXISTE_PT_X_FHC);
				}else{
					// si no existe plan de tratamiento para el archivo
					plantTO=new PlanTratamientoTO();
					plantTO.setFileHC("0");
					ret.setCode(ConstantesSECCD.EXITO_RET);
				}
				ret.setObject(plantTO);
			}catch(Exception e){
				ret.setCode(ConstantesSECCD.ERROR_RET);
				throw new DAOException(e.getMessage());
			}finally{
				try{
					try{pstmt.close();}catch(Exception e){}
					try{rs.close();}catch(Exception e){}
				}catch(Exception e1){}
			}
		return ret;
	}
	
	public BResult buscarPlanTratamientoEspecifico(String codigo) throws Exception{

		PlanTratamientoTO			plantTO	 			= null;
		PreparedStatement   		pstmt 		 		= null;
		ResultSet 					rs 			 		= null;
		BResult						ret					= new BResult();
		try{
				StringBuffer query  = new StringBuffer();
				query.append(" SELECT PT.PLANTRA_CODIGO,PT.FILEHC,SD.SEDE_ID, ESPECIALIDAD_ORIGEN,PAC.NOMBRE_COMPLETO,OBJETIVOS_TRATAMIENTO"); 
				query.append(" FROM "+schema+"PLAN_TRATAMIENTO PT ");
				query.append(" INNER JOIN "+schema+"ESPECIALIDAD ES ON PT.ESPECIALIDAD_ORIGEN=ES.ESPECIALIDAD_ID"); 
				query.append(" INNER JOIN "+schema+"SEDE SD ON ES.SEDE_ID=SD.SEDE_ID");
				query.append(" INNER JOIN "+schema+"DIAGNOSTICO_DEFINITIVO DD ON DD.FILEHC=PT.FILEHC"); 
				query.append(" INNER JOIN "+schema+"HISTORIA_CLINICA_DETALLE HCD ON HCD.FILEHC=PT.FILEHC");
				query.append(" INNER JOIN "+schema+"HISTORIA_CLINICA HC ON HC.NROHC=HCD.NROHC");
				query.append(" INNER JOIN "+schema+"V_PACIENTE PAC ON PAC.PACIENTE_ID=HC.PACIENTE_ID");
				query.append(" WHERE PT.PLANTRA_CODIGO=?");
				
				System.out.println("PlanTratamientoDAO::buscarPlanTratamientoxArchivo:<"+query.toString()+">");
				pstmt = getConnection().prepareStatement(query.toString());
				pstmt.setString(1,codigo);
				rs=pstmt.executeQuery();
				if(rs.next()){
					plantTO=new PlanTratamientoTO();
					plantTO.setPlantraCodigo(rs.getString(1));
					plantTO.setFileHC(rs.getString(2));
					plantTO.setSede(rs.getString(3));
					plantTO.setEspecialidad(rs.getString(4));
					plantTO.setPaciente(rs.getString(5));		
					plantTO.setObjetivosTratamiento(rs.getString(6));		
				}
				ret.setObject(plantTO);
			}catch(Exception e){
				ret.setCode(ConstantesSECCD.ERROR_RET);
				throw new DAOException(e.getMessage());
			}finally{
				try{
					try{pstmt.close();}catch(Exception e){}
					try{rs.close();}catch(Exception e){}
				}catch(Exception e1){}
			}
		return ret;
	}
	
	public BResult buscarDetallePlanTratamientoEspecifico(String codigo) throws Exception{

		PlanTratamientoDetalleTO	detalleTO 			= null;
		PreparedStatement   		pstmt 		 		= null;
		ResultSet 					rs 			 		= null;
		BResult						ret					= new BResult();
		Map							hashtable 			= new LinkedHashMap();
		String						key					= null;
		try{
				StringBuffer query  = new StringBuffer();
				if( Configuration.getConnectionDB().equalsIgnoreCase("DB2")){
					query.append(" SELECT RTRIM(CAST(FT.COD_FASE AS CHAR(10)))||'-'||RTRIM(CAST(SE.SERVICIO_ID AS CHAR(10))),");
				}else{
					query.append(" SELECT CONCAT(FT.COD_FASE,'-',SE.SERVICIO_ID),");
				}
				query.append(" FT.COD_FASE,FT.NOMBRE,SE.SERVICIO_ID,SE.NOMBRE,ES.NOMBRE,CANTIDAD"); 
				query.append(" FROM "+schema+"DETALLE_PLAN_TRATAMIENTO DPT INNER JOIN "+schema+"FASE_TRATAMIENTO FT ON DPT.COD_FASE=FT.COD_FASE");
				query.append(" INNER JOIN "+schema+"SERVICIO SE ON SE.SERVICIO_ID=DPT.SERVICIO_ID");
				query.append(" INNER JOIN "+schema+"ESPECIALIDAD ES ON ES.ESPECIALIDAD_ID=SE.ESPECIALIDAD_ID");
				query.append(" WHERE DPT.PLANTRA_CODIGO=?");
				
				System.out.println("PlanTratamientoDAO::buscarDetallePlanTratamientoEspecifico:<"+query.toString()+">");
				pstmt = getConnection().prepareStatement(query.toString());
				pstmt.setString(1,codigo);
				rs=pstmt.executeQuery();
				while(rs.next()){
					detalleTO=new PlanTratamientoDetalleTO();
					key= rs.getString(1);
					detalleTO.setConcatenadoServicioxFase(key);
					detalleTO.setCodigoFase(rs.getInt(2));
					detalleTO.setNombreFase(rs.getString(3));
					detalleTO.setCodigoServicio(rs.getInt(4));
					detalleTO.setNombreServicio(rs.getString(5));
					detalleTO.setNombreEspecialidad(rs.getString(6));
					detalleTO.setCantidad(rs.getInt(7));
					hashtable.put(key, detalleTO);
				}
				hashtable = UtilCollections.ordenarElementosMap(hashtable);
				ret.setObject(hashtable);
			}catch(Exception e){
				ret.setCode(ConstantesSECCD.ERROR_RET);
				throw new DAOException(e.getMessage());
			}finally{
				try{
					try{pstmt.close();}catch(Exception e){}
					try{rs.close();}catch(Exception e){}
				}catch(Exception e1){}
			}
		return ret;
	}
	
	public BResult insertaPlanTratamiento(DynaBean dyna,String codigo) throws Exception {
		String 					schema			= Configuration.getSchemaDB();
		BResult					ret				= null;
		PreparedStatement		pstmt 		 	= null;
		try{		
			StringBuffer query  = new StringBuffer();
			query.append(" INSERT INTO "+schema+"PLAN_TRATAMIENTO VALUES(?,?,?,?,?,?,?)");
			pstmt = getConnection().prepareStatement(query.toString());
			pstmt.setString(1,codigo);
			pstmt.setString(2,Utilitario.getPropertyDynaBean(dyna,"txtFileHC"));
			pstmt.setString(3,Utilitario.getPropertyDynaBean(dyna,"cboEspecialidad"));
			pstmt.setInt(4,1);
			pstmt.setString(5,"0");
			pstmt.setString(6,"0");
			pstmt.setString(7,UtilTime.devuelveFechaActual());
			pstmt.executeUpdate();	
			ret = new BResult();
			ret.setCode(ConstantesSECCD.EXITO_RET);;
		}catch(Exception e){
			ret = new BResult();
			ret.setCode(ConstantesSECCD.ERROR_RET);
			ret.setMessage(e.getMessage());
		}finally{
			try{
				pstmt.close();
			}
			catch(Exception e){
				throw new DAOException(e.getMessage());	
			}
		}
		return ret;
	} 
	
	public BResult insertaDetallePlanTratamiento(PlanTratamientoDetalleTO	detalleTO,String codigoPT) throws Exception {
		String 					schema			= Configuration.getSchemaDB();
		BResult					ret				= null;
		PreparedStatement		pstmt 		 	= null;
		try{		
			StringBuffer query  = new StringBuffer();
			query.append(" INSERT INTO "+schema+"DETALLE_PLAN_TRATAMIENTO VALUES(?,?,?,?,?,?,?,?,?)");
			pstmt = getConnection().prepareStatement(query.toString());
			pstmt.setString(1,detalleTO.getCodigoDetalle());
			pstmt.setString(2,codigoPT);
			pstmt.setInt(3,detalleTO.getCodigoFase());
			pstmt.setInt(4,detalleTO.getCodigoServicio());
			pstmt.setString(5,"1");
			pstmt.setString(6,"0");
			pstmt.setString(7,"0");
			pstmt.setString(8,UtilTime.devuelveFechaActual());
			pstmt.setInt(9,detalleTO.getCantidad());
			pstmt.executeUpdate();	
			ret = new BResult();
			ret.setCode(ConstantesSECCD.EXITO_RET);;
		}catch(Exception e){
			ret = new BResult();
			ret.setCode(ConstantesSECCD.ERROR_RET);
			ret.setMessage(e.getMessage());
		}finally{
			try{
				pstmt.close();
			}
			catch(Exception e){
				throw new DAOException(e.getMessage());	
			}
		}
		return ret;
	} 

	public int obtieneCantidadRegistrosxYear() throws Exception{

		PreparedStatement   		pstmt 		 		= null;
		ResultSet 					rs 			 		= null;
		int							cantidad			= 0;
		try{
				StringBuffer query  = new StringBuffer();
				query.append(" SELECT COUNT(*) FROM "+schema+"PLAN_TRATAMIENTO WHERE YEAR(FECHA_REGISTRO)=YEAR(CURRENT_DATE)"); 
				System.out.println("PlanTratamientoDAO::obtieneCantidadRegistrosxYear:<"+query.toString()+">");
				pstmt = getConnection().prepareStatement(query.toString());
				rs=pstmt.executeQuery();
				if(rs.next()){
					cantidad=rs.getInt(1);
				}}catch(Exception e){
				throw new DAOException(e.getMessage());
			}finally{
				try{
					try{pstmt.close();}catch(Exception e){}
					try{rs.close();}catch(Exception e){}
				}catch(Exception e1){}
			}
		return cantidad;
	}
	
	public int obtieneCantidadRegistrosDPT() throws Exception{

		PreparedStatement   		pstmt 		 		= null;
		ResultSet 					rs 			 		= null;
		int							cantidad			= 0;
		try{
				StringBuffer query  = new StringBuffer();
				query.append(" SELECT COUNT(*) FROM "+schema+"DETALLE_PLAN_TRATAMIENTO"); 
				System.out.println("PlanTratamientoDAO::obtieneCantidadRegistrosDPT:<"+query.toString()+">");
				pstmt = getConnection().prepareStatement(query.toString());
				rs=pstmt.executeQuery();
				if(rs.next()){
					cantidad=rs.getInt(1);
				}}catch(Exception e){
				throw new DAOException(e.getMessage());
			}finally{
				try{
					try{pstmt.close();}catch(Exception e){}
					try{rs.close();}catch(Exception e){}
				}catch(Exception e1){}
			}
		return cantidad;
	}
	
	public BResult eliminaDetallePlanTratamiento(String codigo) throws Exception {
		String 					schema			= Configuration.getSchemaDB();
		BResult					ret				= null;
		PreparedStatement		pstmt 		 	= null;
		try{		
			StringBuffer query  = new StringBuffer();
			query.append(" DELETE FROM "+schema+"DETALLE_PLAN_TRATAMIENTO WHERE PLANTRA_CODIGO=?");
			System.out.println("PlanTratamientoDAO::eliminaDetallePlanTratamiento:<"+query.toString()+">");
			pstmt = getConnection().prepareStatement(query.toString());
			pstmt.setString(1,codigo);
			pstmt.executeUpdate();	
			ret = new BResult();
			ret.setCode(ConstantesSECCD.EXITO_RET);;
		}catch(Exception e){
			ret = new BResult();
			ret.setCode(ConstantesSECCD.ERROR_RET);
			ret.setMessage(e.getMessage());
		}finally{
			try{
				pstmt.close();
			}
			catch(Exception e){
				throw new DAOException(e.getMessage());	
			}
		}
		return ret;
	}
	
	/**
	 * Metodo que retorna el 
	 * */
	public PlanTratamientoTO buscaPacientexPlanTratamiento(String codigo) throws Exception{

		PlanTratamientoTO			planTratamTO 	= null;
		PreparedStatement   		pstmt 			= null;
		ResultSet 					rs 				= null;
		String 						schema			= Configuration.getSchemaDB();
	
		try{
			StringBuffer query  = new StringBuffer();
			query.append(" SELECT PAC.NOMBRE_COMPLETO"); 
			query.append(" FROM  "+schema+"PLAN_TRATAMIENTO PT INNER JOIN  "+schema+"HISTORIA_CLINICA_DETALLE HCD"); 
			query.append(" ON HCD.FILEHC=PT.FILEHC");
			query.append(" INNER JOIN "+schema+"HISTORIA_CLINICA HC ON HC.NROHC=HCD.NROHC");
			query.append(" INNER JOIN "+schema+"V_PACIENTE PAC ON PAC.PACIENTE_ID=HC.PACIENTE_ID");
			query.append(" WHERE PLANTRA_CODIGO=?");
			System.out.println("PlanTratamientoDAO::buscaPacientexPlanTratamiento:<"+query.toString()+">");
			pstmt = getConnection().prepareStatement(query.toString());
			pstmt.setString(1,codigo);
			rs=pstmt.executeQuery();
			
			int contador=0;
			while(rs.next()){
				contador++;
				planTratamTO=new PlanTratamientoTO();
				planTratamTO.setPaciente(rs.getString(1));
			}
			if(contador==0){
				planTratamTO=new PlanTratamientoTO();
				planTratamTO.setPaciente("NE");
			}
			
		}catch(Exception e){
			throw new DAOException(e.getMessage());
		}finally{
			try{
				try{pstmt.close();}catch(Exception e){}
				try{rs.close();}catch(Exception e){}
			}catch(Exception e1){}
		}
		return planTratamTO;
	}
	
	
	
	/**
	 * Metodo que retorna el listado de ciclos 
	 * */
	public ArrayList<ServicioTO> getServicioxDetallePlanTratamiento(String codigo) throws Exception{

		ServicioTO				servicioTO 	= null;
		ArrayList<ServicioTO>		lista		= new ArrayList<ServicioTO>();
		PreparedStatement   		pstmt 		= null;
		ResultSet 					rs 			= null;
		String 						schema		= Configuration.getSchemaDB();
	
		try{
			StringBuffer query  = new StringBuffer();

			query.append(" SELECT SE.SERVICIO_ID,SE.NOMBRE"); 
			query.append(" FROM "+schema+"DETALLE_PLAN_TRATAMIENTO DPT INNER JOIN "+schema+"SERVICIO SE");
			query.append(" ON SE.SERVICIO_ID=DPT.SERVICIO_ID");
			query.append(" WHERE DPT.PLANTRA_CODIGO=?");
			System.out.println("PlanTratamientoDAO::getServicioxDetallePlanTratamiento::<"+query.toString()+">");
			pstmt = getConnection().prepareStatement(query.toString());
			pstmt.setString(1,codigo);
			rs=pstmt.executeQuery();
			
			servicioTO=new ServicioTO();
			servicioTO.setCodigo(0);
			servicioTO.setNombre("");
			
			lista.add(servicioTO);
			while(rs.next()){
				servicioTO=new ServicioTO();
				servicioTO.setCodigo(rs.getInt(1));
				servicioTO.setNombre(rs.getString(2));
				lista.add(servicioTO);
			}
		}catch(Exception e){
			throw new DAOException(e.getMessage());
		}finally{
			try{
				try{pstmt.close();}catch(Exception e){}
				try{rs.close();}catch(Exception e){}
			}catch(Exception e1){}
		}
		return lista;
	}
}
